//
// Created by Cammy on 2024/4/26.
//

#ifndef C_DATASTRUCT_STACK_H
#define C_DATASTRUCT_STACK_H

/**
 * 栈：一种特殊的线性表，其只允许在固定的一端进行插入和删除元素的操作。进行数据插入和删除操作的一端称为栈顶,
 *      另一端称为栈底。栈中的数据元素遵守后进行LIFO（LAST IN FIRST OUT）的原则。
 * 压栈：栈的插入操作叫做进栈/压栈/入栈。入数据在栈顶。
 * 出栈：栈的删除操作叫做出栈。出数据也在栈顶。
 */

/**
 * 两种实现方式：
 *      数组 —— 相当于之前顺序表的尾插，用尾去做栈顶。唯一缺点就是空间不够需要增容。
 *      链表 —— 如果用尾做栈顶，那么双向链表更好
 *             如果要用单链表实现，可以用头做栈顶，选择头插的方式，这样出栈入栈都是O(1)
 */

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <malloc.h>
#include <assert.h>

typedef int STDataType;

typedef struct Stack {
    STDataType *arr;
    int top;
    int capacity;
} Stack;

void StackInit(Stack *ps);

void StackDestroy(Stack *ps);

void BuyCapacity(Stack *ps);

// 压栈
void StackPush(Stack *ps, STDataType x);

// 出栈
void StackPop(Stack *ps);

STDataType StackTop(Stack *ps);

int StackSize(Stack *ps);

bool StackEmpty(Stack *ps);


#endif //C_DATASTRUCT_STACK_H
